package cn.jdy.authority.admin;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import cn.jdy.authority.entity.User;
import cn.jdy.authority.service.UserService;
import cn.jdy.framework.constant.BaseConstant;
import cn.jdy.framework.log.BaseLog;
import cn.jdy.framework.safe.SafeUtil;
import cn.jdy.framework.util.DateUtil;
import cn.jdy.framework.util.StringUtil;

/**
 * 系统用户信息管理控制类 
 *
 * @author XiaoZhenx
 * @description: 针对系统用户信息统一管理的控制类。
 * @date 2013-07-09 10:10
 */
@Controller
@RequestMapping("/user")
public class UserCtrl {

	@Autowired
	protected HttpServletRequest request;
	@Autowired
	protected HttpSession session;
	// 自动注入用户信息管理业务处理操作接口
	@Autowired
	private UserService userManage;

	/**
	 * 用户信息列表 异步数据查询
	 *
	 * @return Map<user> 用户信息(user)列表
	 * @description: 根据页面不同查询条件 获取系统用户列表信息
	 * @param: map 用户信息查询条件
	 * @param: curNo 列表查询当前页码
	 * @param: curSize 最大记录位置
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 10:20
	 */
	@RequestMapping("/list")
	@ResponseBody
	public Map<String, Object> list(String curNo, String curSize, String curPgn, String userRealName, String userName, String organName) {
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		try {
			/************* 分页处理开始 ************/
			int skip;
			int max;
			if(curNo == null || "".equals(curNo)) curNo = "0";
			if(curSize == null || "".equals(curSize)) curSize = "500";
			skip = Integer.parseInt(curNo);
			max = Integer.parseInt(curSize);
			request.setAttribute("curNo", curNo);
			request.setAttribute("curSize", curSize);
			/************* 分页处理结束 ************/
			Map<String, String> map = new HashMap<String, String>();
			map.put("userName", userName);
			map.put("userRealName", userRealName);
			map.put("organName", organName);
			
			List<User> list = userManage.findUserInfoList(map, skip, max);
			long countList = userManage.findUserInfoListCount(map);
			User sessionUser = (User) session.getAttribute(BaseConstant.SESSION_USER);
			if(sessionUser != null) {// 将登陆id传到页面，不允许删除自身
				request.setAttribute("userId", sessionUser.getId());
			}
			jsonMap.put("Rows", list);
			jsonMap.put("Total", countList);
		} catch(Exception e) {
			BaseLog.e(this.getClass(), "queryOperationPersonList 查询运维人员列表", e);
		}
		return jsonMap;
	}

	/**
	 * 用户信息 新增初始化
	 *
	 * @return ModelAndView(user) 新增用户信息初始化
	 * @description: 存储系统用户的信息, 不同管理人员对用户信息的添加操作
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 10:25
	 */
	@RequestMapping("/addUserInit")
	public ModelAndView addUserInit() {
		ModelAndView mv = new ModelAndView("/s9/user/user_add.jsp");
		User oper = (User) session.getAttribute("user");
		// 设置添加该用户信息的操作人员
		String expHintDate = "9999-01-01";
		User user = new User();
		user.setStatus("01");
		mv.addObject("user", user);
		return mv;
	}

	/**
	 * 用户信息 新增或修改
	 *
	 * @return String status
	 * @description: 存储系统用户的信息, 不同管理人员对用户信息的添加操作
	 * @param: user 系统用户信息实体类
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 10:25
	 * @modify: GXP 2014-05-24
	 */
	@RequestMapping(value = "/addUser", method = RequestMethod.POST)
	@ResponseBody
	public String addUser(User user) {
		String status = "200";
		try {
			if(StringUtil.isNullOrEmpty(user.getId())) {
				// userid为空时添加用户
				user.setPasswd(SafeUtil.md5(user.getPasswd()).substring(8, 16));
				user.setStatus("01");
				user.setCreateTime(DateUtil.getCurrentDate(DateUtil._DEFAULT2));
				status = userManage.addUser(user);
			} else {
				// userid不为空时，update用户数据
				if (!"".equals(user.getPasswd())) {
					user.setPasswd(SafeUtil.md5(user.getPasswd()).substring(8, 16));
				} else {
					user.setPasswd(null);
				}
				userManage.updUser(user);
			}
		} catch(Exception e) {
			status = "500";
			BaseLog.e(this.getClass(), "addUser", e);
			// BaseLog.e(this.getClass(), "addSysOper 添加运维人员", e);
		}
		return status;
	}

	/**
	 * 用户信息 修改初始化
	 *
	 * @return ModelAndView 修改用户信息的成功、失败信息
	 * @description: 修改系统用户的信息, 对系统用户信息的修改操作
	 * @param: userId 系统用户标识
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 10:30
	 * @modify: GXP 2014-05-24
	 */
	@RequestMapping("/updUserInit")
	@ResponseBody
	public User updUserInit(String userId) {
		User user = null;
		try {
			// 用户信息修改初始化
			user = userManage.findOne("id", userId);
		} catch(Exception e) {
      BaseLog.e(this.getClass(), "updUserInit 修改运维人员前查询", e);
		}
		return user;
	}

	/**
	 * 获得用户角色
	 * <p/>
	 * String userId
	 */
	@RequestMapping("/findUserRole")
	@ResponseBody
	public Map<String, Object> findUserRole(String userId) {
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		try {
			List<String> list = userManage.findUserRole(userId);
			jsonMap.put("message", "success");
			jsonMap.put("list", list);
		} catch(Exception e) {
			jsonMap.put("message", "error");
		}
		return jsonMap;
	}

	/**
	 * 用户密码重置
	 *
	 * @return String
	 * @description: 对多个系统用户密码重置 操作
	 * @param: userId 用户标识（多个用户时用,号隔开）
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 16:40
	 */
	@RequestMapping("/resetPassword")
	@ResponseBody
	public Map<String, Object> resetPassword(String userIds) {
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		String backInfo = "";
		// 重置前检验是不是有超级管理员
		backInfo = checkAdmin(userIds);
		if("".equals(backInfo)) {
			String password = "666666"; // 可以放配置中
			backInfo = userManage.resetPassword(userIds, SafeUtil.md5(password).substring(8, 16));
			jsonMap.put("message", backInfo);
		}
		return jsonMap;
	}

	/**
	 * 用户信息 删除
	 *
	 * @return Map 删除用户信息的成功、失败信息
	 * @description: 删除指定用户标识的系统用户信息, 对多个系统用户信息的删除操作
	 * @param: userIds 用户标识（多个用户时用,号隔开）
	 * @author: XiaoZhenx
	 * @date: 2013-07-08 16:40
	 */
	@RequestMapping("/delUser")
	@ResponseBody
	public Map<String, Object> delUser(String userIds) {
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		String backInfo = "";
		// 删除前检验是不是有超级管理员
		backInfo = checkAdmin(userIds);
		if("".equals(backInfo)) {
			// userIds = userIds.substring(0, userIds.length() - 1);
			backInfo = userManage.delUserById(userIds);
			jsonMap.put("message", backInfo);
		}
		return jsonMap;
	}

	/**
	 * 管理员相关操作验证
	 *
	 * @return String
	 * @description: 删除、启用、停用用户前检验是不是有超级管理员
	 * @param: userIds 用户标识（多个用户时用,号隔开）
	 */
	public String checkAdmin(String userIds) {
		String backInfo = "";
		String[] ids = userIds.split(",");
		for(String id : ids) {
			if(BaseConstant.SUPER_OPER_ID.equals(id)) {
				backInfo = "超级管理员用户不能进行删除、启用、停用操作";
				return backInfo;
			}
		}
		return backInfo;
	}

	/**
	 * 用户信息 启用和停用操作
	 *
	 * @return Map 用户状态信息的更新成功、失败信息
	 * @description: 启用和停用指定用户标识的系统用户信息。 启用操作是将用户从锁定状态修改为正常状态 停用操作是将用户从正常状态修改为锁定状态
	 * @param: userIds 用户标识（多个用户时用,号隔开）
	 * @param: status 操作状态（1 启用 0 停用）
	 * @author: XiaoZhenx
	 * @date: 2013-07-10 16:40
	 * @modify: GXP 2014-05-24
	 */
	@RequestMapping("/updUserStatus")
	@ResponseBody
	public Map<String, Object> updUserStatus(String userIds, String status) {
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		String backInfo = "";
		// 启用和停用前检验是不是有超级管理员
		backInfo = checkAdmin(userIds);
		if("".equals(backInfo)) {
			backInfo = userManage.updUserStatus(userIds, status);
			jsonMap.put("message", backInfo);
		}
		return jsonMap;
	}

	@RequestMapping(value = "/userdetail", method = RequestMethod.GET)
	public ModelAndView findUserdetail() {
		User user = (User) session.getAttribute("user");
		ModelAndView mv = new ModelAndView();
		mv.addObject("user", user);
		mv.setViewName("/s9/user/userdetail.jsp");
		return mv;
	}

	/**
	 * 修改用户密码
	 *
	 * @param password
	 * @author: GXP
	 * @date: 2014-05-24
	 */
	@RequestMapping(value = "/modfiypwd", method = RequestMethod.POST)
	@ResponseBody
	public void modfiypwd(String password) {
		User user = (User) session.getAttribute("user");
		userManage.modifyPwd(user.getId(), password);
	}
}
